package com.itkaien.javaeebased.demo03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
import org.junit.Test;
import org.springframework.format.annotation.DateTimeFormat;

public class TimeTest {


    @Test
    public void test() throws ParseException {

        /**
         * 在Java中，Date类的setYear(int year)方法和getYear()方法都是基于1900年的。这是因为Date类的设计是受到了C语言的struct tm结构的影响，而struct tm结构中的年份是从1900年开始计算的。
         *
         * 所以，当你调用date.setYear(2013)时，实际上是在设置Date对象的年份为2013 + 1900 = 3913年。这也是为什么当你调用date.getYear()时，返回的是当前年份减去1900的值。
         *
         * 然而，这种设计在JDK8中已经被废弃，因为它引起了很多混淆和错误。在JDK8及以后的版本中，你应该使用Calendar类或LocalDate类来处理日期和时间。
         */
        //JDK8之前
        Date date = new Date();//活得距1970年的时间戳
        long time = date.getTime();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(time);
        System.out.println(format);
        System.out.println(time);
        date.setYear(2013);
        date.setMonth(1);
        date.setDate(1);
        System.out.println(date);
        int year = date.getYear();
        System.out.println(year);

        Calendar cal = Calendar.getInstance();

        System.out.println(cal+"\n"+cal.getTime());
        cal.set(Calendar.YEAR, 2013);
        System.out.println(cal+"\n"+cal.getTime());
        System.out.println("format:calendar"+simpleDateFormat.format(cal.getTime()));
        //////////////////////////////////////////////////////////

        //JDK8之后

        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

        System.out.println("年月日+++++++++++++++");
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);

        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(dateTimeFormatter.format(localDateTime));

        LocalDate localDate1 = localDate.of(2013, 1, 1);
        System.out.println(localDate1);

        LocalDateTime localDateTime1 = localDateTime.of(2013, 1, 1, 12, 20,21,22);
        System.out.println(localDateTime1);
        LocalDate localDatenew  = LocalDate.now();
        LocalDate plustime = localDatenew.plus(1, ChronoUnit.DAYS);
        System.out.println(localDatenew);
        System.out.println(plustime);
        System.out.println(plustime.plusDays(1));
        System.out.println(plustime.plusMonths(1));
        System.out.println(plustime.plusYears(1));
        System.out.println(plustime.plusWeeks(1));

        LocalDate date1 = LocalDate.of(2024, 6, 25);
        LocalDate date2 = LocalDate.of(2024, 6, 30);
        LocalDate plus = date1.plus(-1, ChronoUnit.DAYS);
        System.out.println("plus:" + plus);
        LocalDate daysBetween = ChronoUnit.DAYS.addTo(date1, -1);
        LocalDate yearSplus = ChronoUnit.YEARS.addTo(date1, -1);
        System.out.println("Days between: " + daysBetween);
        System.out.println("yearSplus between: " + yearSplus);

        long until = date2.until(date1, ChronoUnit.DAYS);
        System.out.println("until:" + until);
        Period between = Period.between(date1, date2);
        int days = between.getDays();
        System.out.println("Periodbetween:" + between+" days:"+days);

        /**
         * yjava.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds
         * Duration处理的是时间插值不是日期差值、
         * Duration、Period和ChronoUnit是Java中用于处理日期和时间的不同类和枚举类型。
         *
         * Duration类用于表示时间的持续时间，即处理时间差值。它可以表示以小时、分钟、秒和纳秒为单位的时间差。Duration类提供了一系列方法来计算和操作时间差值，例如between()用于计算两个时间点之间的差值。
         *
         * Period类用于表示日期的差值，即处理日期之间的差值。它可以表示以年、月和日为单位的日期差。Period类提供了一系列方法来计算和操作日期差值，例如between()用于计算两个日期之间的差值。
         *
         * ChronoUnit是一个枚举类型，用于表示时间单位。它提供了一种方便的方式来计算两个日期或时间之间的差值。你可以使用ChronoUnit的方法，如between()、addTo()和isSupportedBy()来执行日期和时间的计算。
         *
         * 总结起来，Duration用于处理时间差值，Period用于处理日期差值，而ChronoUnit是用于计算日期和时间差值的单位枚举类型。它们各自提供了不同的方法和功能，以满足不同的日期和时间处理需求。
         */
//        Duration between1 = Duration.between(date1, date2);
//        System.out.println("Durationbetween:" + between1);
        LocalDateTime dateTime1 = LocalDateTime.of(2024, 6, 25,12, 0, 0);
        LocalDateTime dateTime2 = LocalDateTime.of(2024, 6, 25,10, 0, 0);
        Duration between1 = Duration.between(dateTime1, dateTime2);
        System.out.println("Durationbetween:" + between1+between1.toHours());


        System.out.println("年月日时分秒+++++++++++++++");






    }

}
